Next: Adding export back-ends, Previous: Add-on packages, Up: Hacking [Contents][Index]
Org has a large number of hyperlink types built-in (see Hyperlinks). If you would like to add new link types, Org provides an interface for doing so. Let’s look at an example file, org-man.el, that will add support for creating links like ‘[[man:printf][The printf manpage]]’ to show Unix manual pages inside Emacs:
;;; org-man.el - Support for links to manpages in Org
(require 'org)
(org-add-link-type "man" 'org-man-open)
(add-hook 'org-store-link-functions 'org-man-store-link)
(defcustom org-man-command 'man
"The Emacs command to be used to display a man page."
:group 'org-link
:type '(choice (const man) (const woman)))
(defun org-man-open (path)
"Visit the manpage on PATH.
PATH should be a topic that can be thrown at the man command."
(funcall org-man-command path))
(defun org-man-store-link ()
"Store a link to a manpage."
(when (memq major-mode '(Man-mode woman-mode))
;; This is a man page, we do make this link
(let* ((page (org-man-get-page-name))
(link (concat "man:" page))
(description (format "Manpage for %s" page)))
(org-store-link-props
:type "man"
:link link
:description description))))
(defun org-man-get-page-name ()
"Extract the page name from the buffer name."
;; This works for both `Man-mode' and `woman-mode'.
(if (string-match " \\(\\S-+\\)\\*" (buffer-name))
(match-string 1 (buffer-name))
(error "Cannot create link to this man page")))
(provide 'org-man)
;;; org-man.el ends here
You would activate this new link type in .emacs with
(require 'org-man)
Let’s go through the file and see what it does.
(require 'org) to make sure that
org.el has been loaded.org-add-link-type to
define a new link type with prefix
‘man’. The call also contains the name
of a function that will be called to follow such a link.org-store-link-functions, in
order to allow the command C-c l to record a useful
link in a buffer displaying a man page.The rest of the file defines the necessary variables and
functions. First there is a customization variable that
determines which Emacs command should be used to display man
pages. There are two options, man and
woman. Then the function to follow a link is
defined. It gets the link path as an argument—in this case
the link path is just a topic for the manual command. The
function calls the value of org-man-command to
display the man page.
Finally the function org-man-store-link is
defined. When you try to store a link with C-c l, this
function will be called to try to make a link. The function must
first decide if it is supposed to create the link for this buffer
type; we do this by checking the value of the variable
major-mode. If not, the function must exit and
return the value nil. If yes, the link is created by
getting the manual topic from the buffer name and prefixing it
with the string ‘man:’. Then it must
call the command org-store-link-props and set the
:type and :link properties. Optionally
you can also set the :description property to
provide a default for the link description when the link is later
inserted into an Org buffer with C-c C-l.
When it makes sense for your new link type, you may also
define a function org-PREFIX-complete-link that
implements special (e.g., completion) support for inserting such
a link with C-c C-l. Such a function should not accept
any arguments, and return the full link with prefix.
Next: Adding export back-ends, Previous: Add-on packages, Up: Hacking [Contents][Index]